package demo.topic14;

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式（Regular Expression）
 * java.util.regex包中提供以下两个类对正则表达式的支持：
 * 1. Matcher类：通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
 * 2. Pattern类：正则表达式的编译表示形式。
 */
public class RegexDemo {
    /**
     * 一、Pattern
     * public final class Pattern extends Object implements Serializable
     * 正则表单时的编译表示形式。
     * 指定为字符串的正则表达式必须首先被编译（complie）为 Pattern 的实例。
     *
     * 二、Matcher
     * public final class Matcher extends Object implements MatchResult
     * Matcher类的主要功能是用于进行正则的匹配。
     * 方法：
     * （1）boolean matches()：尝试将整个区域与模式匹配
     * （2）String replaceAll(String replacement)：替换模式与给定替换字符串相匹配（每个子序列）
     * （3）String replaceFirst(String replacement)：替换模式与给定替换字符串相匹配（第一个子序列）
     * （4）String[] split(String regex)：根据给定正则表达式的匹配拆分此字符串
     */
    @Test
    public void test1() {
        // 创建一个匹配模式 /a*b/
        Pattern p = Pattern.compile("a*b");
        Matcher m = p.matcher("aaaaaaab");
        // 匹配 /a*b/.test("aaaaaaab")
        boolean b = m.matches();
        System.out.println(b);
    }

    @Test
    public void test2() {
        String s = "5201314";

        boolean b = s.matches("^\\d+$");
        boolean b1 = s.matches("^[0-9]+$");

        System.out.println(b);
        System.out.println(b1);
    }

    /**
     * 匹配电话号码
     */
    @Test
    public void testTelephoneNumber() {
        String telephoneNumber = "010-38389438";
        boolean b = telephoneNumber.matches("^\\d{3,4}-\\d{7,8}$");
        System.out.println("电话号码格式是否正确："+b);
    }

    /**
     * 匹配手机号码
     */
    @Test
    public void testMobilePhoneNumber() {
        String mobilePhoneNumber = "18899793105";
        boolean b = mobilePhoneNumber.matches("^1[3-9]\\d{9}$");
        System.out.println("手机号码格式是否正确："+b);
    }

    /**
     * 匹配用户名：字母开头，数字字母下划线组合
     */
    @Test
    public void testUsername() {
        String username = "admin123";
        boolean b = username.matches("^[a-zA-Z]+(\\w|_)*$");  // \w 等同于 [a-zA-Z0-9]
        System.out.println("用户名格式是否正确："+b);
    }

    /**
     * 匹配IP地址
     */
    @Test
    public void testIp() {
        String ip = "255.255.255.0";
        boolean b = ip.matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}");
        System.out.println("IP地址格式是否正确："+b);
    }

    /**
     * 匹配网址
     */
    @Test
    public void testUrl() {
        String url = "http://www.baidu.com";
        boolean b = url.matches("http://\\w+.\\w+.\\S*");
        System.out.println("网址是否正确："+b);
    }
}
